package org.sunriz.utils;

import org.sunriz.utils.Constant;

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.regex.*;

/**
 * 文本格式校验器
 * 暂时只能对数值修改进匹配，如果文本修改，则会提示❌ 格式校验失败：文件结构已被修改
 * 
 */
public class TextFormatValidator {

    private static String ENCODING = "GB18030";  // 替换为实际编码

    // 数值模式匹配（整数、小数、科学计数法）
    private static final Pattern NUMBER_PATTERN =
            Pattern.compile("-?\\d+(\\.\\d+)?([eE][-+]?\\d+)?");

    // 文本描述模式匹配 (匹配除空格、标点外的连续字符)
    private static final Pattern TEXT_PATTERN =
            Pattern.compile("\\b[a-zA-Z\\u4e00-\\u9fa5][\\w\\u4e00-\\u9fa5]+\\b");

    // 特殊字符转义（用于正则表达式中的特殊字符）
    private static final String REGEX_SPECIAL_CHARS = "<([{\\^-=$!|]})?*+.>";

    public static void main(String[] args) {
//        String originalFile = "D:\\develop\\Code_Java\\DcsPointRefactor\\src\\main\\resources\\20250626_16_47\\CU22.txt";
//        String modifiedFile = "D:\\develop\\Code_Java\\DcsPointRefactor\\src\\main\\resources\\CU22.txt";
                String originalFile = "";
        String modifiedFile = "";


        try {
            // 读取文件内容
            String originalContent = readFile(originalFile);
            String modifiedContent = readFile(modifiedFile);

            // 生成格式模板
            String originalTemplate = generateFormatTemplate(originalContent);
            String modifiedTemplate = generateFormatTemplate(modifiedContent);

            // 可选：保存模板用于调试
            Files.write(Paths.get("original_template.txt"), originalTemplate.getBytes());
            Files.write(Paths.get("modified_template.txt"), modifiedTemplate.getBytes());

            // 比较格式模板
            if (originalTemplate.equals(modifiedTemplate)) {
                System.out.println("✅ 格式校验通过：文件结构未发生变化");
            } else {
                System.out.println("❌ 格式校验失败：文件结构已被修改");

                // 找出差异位置（可选）
                findFormatDifferences(originalTemplate, modifiedTemplate);
            }

        } catch (IOException e) {
            System.err.println("文件处理错误: " + e.getMessage());
        }
    }

    /**
     * 使用指定编码读取文件
     */
    private static String readFile(String filePath) throws IOException {
        // 使用字节数组确保读取完整
        byte[] bytes = Files.readAllBytes(Paths.get(filePath));
        return new String(bytes, Charset.forName(Constant.ENCODING_GB18030));
    }


    /**
     * 生成格式模板：
     * 1. 将数值替换为 [NUMBER]
     * 2. 将文本描述替换为 [TEXT]
     * 3. 保留所有空格、标点、换行符等格式元素
     */
    private static String generateFormatTemplate(String content) {
        // 第一步：替换所有数值
        Matcher numMatcher = NUMBER_PATTERN.matcher(content);
        String template = numMatcher.replaceAll("[NUMBER]");

        // 第二步：替换文本描述（保留格式对齐）
        Matcher textMatcher = TEXT_PATTERN.matcher(template);
        StringBuffer sb = new StringBuffer();

        while (textMatcher.find()) {
            String word = textMatcher.group();

            // 修复：兼容所有Java版本的占位符生成
            StringBuilder placeholder = new StringBuilder();
            placeholder.append(word.charAt(0)); // 保留第一个字符

            // 创建等长占位符（替代repeat方法）
            for (int i = 1; i < word.length(); i++) {
                // 保留原始字符类型（中文/英文）但替换内容
                if (Character.UnicodeBlock.of(word.charAt(i)) == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS) {
                    placeholder.append('〇'); // 中文占位符
                } else {
                    placeholder.append('x'); // 英文占位符
                }
            }

            textMatcher.appendReplacement(sb, Matcher.quoteReplacement(placeholder.toString()));
        }
        textMatcher.appendTail(sb);

        return sb.toString();
    }

    /**
     * 找出格式差异的具体位置
     */
    private static void findFormatDifferences(String template1, String template2) {
        String[] lines1 = template1.split("\r?\n");
        String[] lines2 = template2.split("\r?\n");

        int minLines = Math.min(lines1.length, lines2.length);

        for (int i = 0; i < minLines; i++) {
            if (!lines1[i].equals(lines2[i])) {
                System.out.println("\n--- 第 " + (i + 1) + " 行发现差异 ---");
                System.out.println("原始格式: " + lines1[i]);
                System.out.println("修改格式: " + lines2[i]);

                // 找出行内差异位置
                findLineDifference(lines1[i], lines2[i]);
                return; // 找到第一个差异即返回
            }
        }

        if (lines1.length != lines2.length) {
            System.out.println("\n--- 行数差异 ---");
            System.out.println("原始文件行数: " + lines1.length);
            System.out.println("修改文件行数: " + lines2.length);
        }
    }

    /**
     * 比较行内差异
     */
    private static void findLineDifference(String line1, String line2) {
        int minLength = Math.min(line1.length(), line2.length());

        for (int i = 0; i < minLength; i++) {
            if (line1.charAt(i) != line2.charAt(i)) {
                System.out.println("差异位置: 第 " + (i + 1) + " 个字符");
                System.out.println("原始位置上下文: ..." +
                        safeSubstring(line1, Math.max(0, i - 10), Math.min(line1.length(), i + 10)) + "...");
                System.out.println("修改位置上下文: ..." +
                        safeSubstring(line2, Math.max(0, i - 10), Math.min(line2.length(), i + 10)) + "...");
                return;
            }
        }

        if (line1.length() != line2.length()) {
            System.out.println("行长度差异: 原始行长度 " + line1.length() +
                    ", 修改行长度 " + line2.length());
        }
    }

    private static String safeSubstring(String str, int start, int end) {
        return str.substring(Math.max(0, start), Math.min(str.length(), end));
    }
}